home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
keycodes.zip
/
KEYCODES.ASM
next >
Wrap
Assembly Source File
|
1989-04-16
|
15KB
|
501 lines
PAGE ,132
;
;
; Thomas Nofsinger
; cccc ASM 290
; 4/16/89
;
;
; PROGRAM LISTING FOR KEYCODES.EXE
;
; THIS PROGRAM WILL DISPLAY THE SCAN CODE AND THE ALPHANUMERIC
; VALUE OF ANY DEPRESSED KEYBOARD KEY. IT WILL EXIT AFTER DOING THREE
; DISPLAY CYCLES.
;
;
;
;PROCEDURES TO
EXTRN NEWLINE:FAR ;DISPLAY NEWLINE CHARACTER
EXTRN PUTDEC:FAR ;DISPLAY 16-BIT DECIMAL INTEGER
EXTRN PUTSTRNG:FAR ;DISPLAY CHARACTER STRING
EXTRN CLEAR:FAR ;CLEAR SCREEN
;
;
; MACRO DEFINITIONS
INCLUDE PUSHPOP.MAC
;
;
; S T A C K S E G M E N T D E F I N I T I O N
;
STACK SEGMENT STACK
DB 256 DUP(?)
STACK ENDS
;
; D A T A S E G M E N T D E F I N I T I O N
;
DATA SEGMENT
;
; COPYRIGHT BOX
LINE db ' __________________________________________________________ '
SIDE db ' | | '
CPY_RT db ' | Copyright 1989 Thomas I. Nofsinger; All Rights Reserved | '
B_LINE db ' |__________________________________________________________| '
;
PROMPT1 DB ' This program returns the scan code and the alphanumeric value of '
PROMPT2 DB ' any depressed key. This program will exit after displaying 15 codes.'
PROMPT3 DB ' Due to non-compatibility between PC keyboards, If the key you press '
PROMPT4 DB ' is a non-printable character, look under your finger to see what key '
PROMPT5 DB ' you pressed. For quick exit, hit the same key twice. Program on: '
HEADING DB ' INS CAP NUM SCR ALT CTRL LSHFT RSHFT CHAR CODE NON-PRINTABLE'
XXX DB 'xxxx' ; for marking out colm's
wipeout DB ' '
SYMBOL DB '*'
EVEN
ASCII DB 0 ;INIT TO ZERO
FRAME_ROW DB 0 ;INIT TO ZERO
;
EVEN ;USE EVEN MEMORY ADDRESSES
SCAN DW 0 ;INIT TO ZERO
SCAN1 DW 0 ;INIT TO ZERO
FLAG DW 0 ;INIT TO ZERO
FLAG1 DW 1 ;INIT TO ONE
TEMP DW 0 ;INIT TO ZERO
COUNT DW 15 ;INIT TO 15
DATA ENDS
;
; C O D E S E G M E N T D E F I N I T I O N
;
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,ES:DATA
KEYCODES PROC FAR
PUSH DS ;PUSH RETURN SEG ADDR ON STACK
SUB AX,AX ;PUSH RETURN OFFSET OF ZERO
PUSH AX ;ON STACK
MOV AX,SEG DATA ;SET ES-REGISTER TO POINT
MOV ES,AX ;TO DATA SEGMENT
;
; set up screen
MOV AH,0 ;set video mode
mov al,3 ;color text mode
INT 10H ;clear screen
call clear ;clear screen
mov dh,20 ;place cursor at row 18
mov dl,0 ; colm 0
mov ah,2 ; sub call for int 10h
int 10h ;Bios interrupt for cursor motion
;
lea di,LINE ; print copyright w/box, line
mov cx,70 ; by line.
call putstrng ;
call newline ;
lea di,SIDE ;
mov cx,70 ;
call putstrng ;
call newline ;
lea di,CPY_RT ;
mov cx,70 ;
call putstrng ;
call newline ;
lea di,B_LINE ;
mov cx,70 ;
call putstrng ;
call newline ;END BOX
;
mov dh,10 ;place cursor at row 10
mov dl,0 ; colm 0
mov ah,2 ; sub call for int 10h
int 10h ;Bios interrupt for cursor motion
;
LEA DI,PROMPT1 ;PROMPT FOR EXPLAINATION 1 OF 5
MOV CX,75
CALL PUTSTRNG
CALL NEWLINE
LEA DI,PROMPT2 ;PROMPT FOR EXPLAINATION 2 OF 5
MOV CX,75
CALL PUTSTRNG
CALL NEWLINE
LEA DI,PROMPT3 ;PROMPT FOR EXPLAINATION 3 OF 5
MOV CX,75
CALL PUTSTRNG
CALL NEWLINE
LEA DI,PROMPT4 ;PROMPT FOR EXPLAINATION 4 OF 5
MOV CX,75
CALL PUTSTRNG
CALL NEWLINE
LEA DI,PROMPT5 ;PROMPT FOR EXPLAINATION 5 OF 5
MOV CX,75
CALL PUTSTRNG
CALL NEWLINE
;
mov dh,4 ;place cursor at row 4
mov dl,0 ; colm 0
mov ah,2 ; sub call for int 10h
int 10h ;Bios interrupt for cursor motion
lea di,heading ; print heading
mov cx,75
call putstrng
call newline
CALL FRAME ;DRAW FRAME
IN_KEY:
MOV AH,2 ;GET KEYBOARDS FLAG BYTES
INT 16H ;BIOS KEYBOARD CALL
XOR AH,AH ;ZERO AH
MOV FLAG,AX ;SAVE FLAGS WITH ZEROS IN HIGH BYTE
CMP AX,FLAG1 ;SAME FLAG AS BEFORE?
JNE N_FLAG ;DIFFERENT FLAG, GO SHOW IT!
MOV AH,1 ;IS THERE A BYTE IN KEYBOARD BUFFER?
INT 16H ;BIOS KEYBOARD CALL
JNZ CODE_DISPLAY ;ZF=0, BYTE WAITING, GO GET IT!
JMP SHORT IN_KEY ;TAKE IT FROM THE TOP
N_FLAG:
MOV FLAG1,AX ;Save the new flag for the next cycle
CALL CLEARLINE ;SETUP FOR NEW DISPLAY
CALL NEWFLAG ;SHOW FLAG ROUTINE
JMP SHORT IN_KEY ;DONE. TAKE IT FROM THE TOP
CODE_DISPLAY:
CALL CLEARLINE
CALL NEWFLAG
MOV AH,0 ;READ KEYBOARD BUFFER
INT 16H ;BIOS KEYBOARD CALL
MOV TEMP,AX ;HOLD RESULTS FOR A SECOND
XOR AH,AH ;ZERO HIGH BYTE TO JUST GET ASCII CODE
MOV ASCII,AL ;SAVE ASCII CODE
MOV AX,TEMP ;GET RESULTS
XCHG AH,AL ;PLACE SCAN CODE INTO LOW BYTE
XOR AH,AH ;ZERO HIGH BYTE
MOV SCAN,AX ;SAVE SCAN CODE
CMP AX,SCAN1 ;SAME KEY AS LAST TIME?
JE STOP1 ;YES IT WAS, EXIT PROGRAM
JMP SHORT POTS1 ;YOUR BASIC SKIP CODE BLOCK
STOP1:
JMP LAST ; LONG JMP
POTS1:
MOV SCAN1,AX ;PLACE SCAN INTO SCAN1 FOR NEXT CYCLE
MOV DH,5 ;PLACE CURSOR AT ROW 5
MOV DL,50 ; COLM 50
MOV BH,0
MOV AH,2 ;PLACE CURSOR SUB FUNCTION
INT 10H ;BIOS SCREEN INTERRUPT
LEA DI,ASCII ;GET CHAR
MOV CX,1 ;ONE CHAR
CALL PUTSTRNG ;DISPLAY CHAR
MOV DH,5 ; ROW 5
MOV DL,56 ; COLM 56
MOV BH,0
MOV AH,2 ;PLACE CURSOR SUB FUNCTION
INT 10H ;BIOS SCREEN INTERRUPT
MOV AX,SCAN ;GET SCAN CODE
MOV BX,0 ;RIGHT JUSTIFY DEC #
CALL PUTDEC ;DISPLAY SCAN CODE AS NUMBER
dec count ; count=count-1
mov ax,count
cmp ax,0
jz last
MOV Al,ASCII ;GET CHAR
CMP Al,0 ;CHECK FOR ZERO
JZ NON_PRT ;PRINT NON_PRINTABLE COLM
JMP IN_KEY ;DONE. TAKE IT FROM THE TOP
NON_PRT:
CALL NONPRT
JMP IN_KEY
;
LAST:
mov dh,24 ;place cursor at row 24
mov dl,0 ; colm 0
mov bh,0
mov ah,2 ; sub call for int 10h
int 10h ;Bios interrupt for cursor motion
RET ;RETURN
KEYCODES ENDP
;
CLEARLINE PROC NEAR
mov dh,5 ; row 5
mov dl,1 ; colm 1
mov bh,0
mov ah,2 ;place cusor sub func
int 10